package flychess.view;

import flychess.data.GameMap;
import flychess.entity.Player;
import flychess.util.XMLParser;

import java.util.Random;

public class DisplayMapRect extends DisplayMap{
    private final int rowLen;
    private final int colLen;
    private final int colNum;

    public DisplayMapRect(GameMap map, boolean isRandom) {
        this.gMap = map;
        if (isRandom) {
            Random rand = new Random();
            this.colLen = rand.nextInt(3) + 3;
            this.colNum = rand.nextInt(3) + 2;
        } else {
            this.colLen = XMLParser.getMapViewConfig("colLen");
            this.colNum = XMLParser.getMapViewConfig("colNum");
        }
        this.rowLen = (gMap.mapLen - colLen * colNum) / (colNum + 1) + 1;
    }

    /**
     * 显示对战地图
     * @param player1 玩家1
     * @param player2 玩家2
     */
    @Override
    public void showMap(Player player1, Player player2) {
        int pos = 0;
        for (int i = 1; i <= colNum; i++) {
            if (i % 2 == 0) {
                showLine2(pos, pos += rowLen, player1, player2);     //显示地图偶数行
                showLLine(pos, pos += colLen, player1, player2);     //显示地图左列
            }
            else {
                showLine1(pos, pos += rowLen, player1, player2);   //显示地图奇数行
                showRLine(pos, pos += colLen, player1, player2);     //显示地图右列
            }
        }
        if (pos < gMap.mapLen && colNum % 2 != 0) {
            for (int j = 0; j < rowLen - 1; j++) System.out.print("　");
        }
        showLine1(pos, this.gMap.mapLen, player1, player2);     //显示地图第3行
        System.out.println();
    }

    /**
     * 输出地图的奇数行（第1、3行）
     * @param start 输出的起始点在地图上的位置
     * @param end  输出的结束点在地图上的位置
     * @param player1 玩家1
     * @param player2 玩家2
     */
    public void showLine1(int start, int end, Player player1, Player player2){
        for(int i = start; i < end; i++){
            System.out.print(getGraph(gMap.map[i], i, player1, player2));
        }
        System.out.println();                        //换行
    }

    /**
     * 输出地图的偶数行（第2行）
     * @param start 输出的起始点在地图上的位置
     * @param end  输出的结束点在地图上的位置
     * @param player1 玩家1
     * @param player2 玩家2
     */
    public void showLine2(int start, int end, Player player1, Player player2){
        for(int i = end - 1; i >= start; i--){
            System.out.print(getGraph(gMap.map[i], i, player1, player2));
        }
        System.out.println();                        //换行
    }

    /**
     * 输出地图的右竖列
     * @param start 输出的起始点在地图上的位置
     * @param end  输出的结束点在地图上的位置
     * @param player1 玩家1
     * @param player2 玩家2
     */
    public void showRLine(int start, int end, Player player1, Player player2){
        for (int i = start;  i < end; i++) {
            for (int j = 0; j < rowLen - 1; j++) System.out.print("　");
            System.out.println(getGraph(gMap.map[i], i, player1, player2));
        }
    }

    /**
     * 输出地图的左竖列
     * @param start 输出的起始点在地图上的位置
     * @param end  输出的结束点在地图上的位置
     * @param player1 玩家1
     * @param player2 玩家2
     */
    public void showLLine(int start, int end, Player player1, Player player2){
        for(int i = start; i < end; i++){
            System.out.println(getGraph(gMap.map[i], i, player1, player2));
        }
    }
}
